漏洞背景
2020年3月6日,Oracle Coherence 反序列化远程代码执行漏洞(CVE-2020-2555)的细节被公开,Oracle Coherence为Oracle融合中间件中的产品,在WebLogic 12c及以上版本中默认集成到WebLogic安装包中,攻击者通过t3协议发送构造的序列化数据,能过造成命令执行的效果
影响版本
Oracle Coherence 3.7.1.17
Oracle Coherence 12.1.3.0.0
Oracle Coherence 12.2.1.3.0
Oracle Coherence 12.2.1.4.0
漏洞分析
gadget分析-链1
1 | Gadget chain: |
官方修补了LimitFilter.toString()
,该方法如下
主要关注我标记了的地方,如果m_comparator
属性是ValueExtractor
的实例,那么就会去调用extract
方法,并且传入m_oAnchorTop
属性,这里我们就需要明确最终的目的,造成命令执行,比较理想的就是能够调用Method.invoke()
,通过反射调用任意方法,通过寻找,发现了com.tangosol.util.extractor.ReflectionExtractor
类,该类可被序列化
我们看到他的extract
方法,调用了method.invoke
,两个参数都为序列化中的可控变量
不过我们知道,单凭这一个method.invoke
是没法调用到Runtime.getRuntime().exec()
的,需要再去寻找一个中间点去反复调用这个方法,这里就十分的类似Commons Collections
的gadgets
,那么这个中间点就是com.tangosol.util.extractor.ChainedExtractor
方法,他的extract
方法
这样就能够将一整个反射给连接起来了,通过反射来造成java.lang.Runtime.getRuntime().exec
的效果
那么回到最开始,我们还没有说怎么去调用LimitFilter.toString()
方法,看到BadAttributeValueExpException
重写的readObject
方法,这里的readObject
的valObj
变量是我们可控的,在进行反序列化时,java会调用ObjectInputStream
类的readObject()
方法。如果被反序列化的类重写了readObject
方法,那么该类在进行反序列化时,Java
会优先调用重写的readObject
方法
类似的gadgets
也出现在CommonsCollections5里,
链2-by @Lucifaer
基于某表达式语言的执行,比公开的第一条链简单,不需要用到多次反射
漏洞利用
通过t3协议将反序列化数据发送给weblogic server
修复建议
升级补丁,参考oracle官网发布的补丁https://www.oracle.com/security-alerts/cpujan2020.html 如果不依赖T3协议进行JVM通信,禁用T3协议。
进入WebLogic
控制台,在base_domain
配置页面中,进入安全选项卡页面,点击筛选器,配置筛选器。 在连接筛选器中输入:weblogic.security.net.ConnectionFilterImpl
,在连接筛选器规则框中输入 7001 deny t3 t3s 保存生效(需重启)